<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0px;
            padding: 0px;
            list-style: none;
            box-sizing: border-box;
        }

        /* 外面盒子的高度固定设置为一个li的高度，并使用overflow:hidden截取多余部分 */
        .swiper-box {
            height: 60px;
            width: 200px;
            overflow: hidden;
        }

        /* li的高度需要和外面盒子的高度保持一致 */
        .swiper-ul>li {
            height: 60px;
            line-height: 60px;
            text-align: center;
            border: 1px solid #000;
        }
    </style>
</head>

<body>
    <div class="swiper-box">
        <ul class="swiper-ul">
            <li>我是第一行</li>
            <li>我是第二行</li>
            <li>我是第三行</li>
            <li>我是第四行</li>
        </ul>
    </div>
</body>
<script>
    /* 
    位移原理：ul的Y轴进行位移 
    动画原理：使用transition 1s（表示所有属性在1s内完成渐变），
    如果将transform的位移值变化，那么也会渐变过去
    */

    let ul = document.querySelector(".swiper-ul");

    // 查找ul下面的所有li，推荐采用getElementsByTagName（这里不要使用querySelectorAll会有BUG）
    let lis = ul.getElementsByTagName("li");

    // 使用JS赋值transition
    ul.style.transition = '1s'

    setInterval(() => {
        // 如果目前在位移状态：立刻恢复到没有位移的状态（取消渐变动画效果）
        if (ul.style.transform == 'translateY(-60px)') {
            ul.style.transition = null;
            ul.style.transform = "translateY(0px)";

            // 把当前第一张，推到最后一张（代码会自动完成移动操作，把数组第一位拿出来并放到数组末尾）
            ul.appendChild(lis[0]);
        } else {
            ul.style.transition = "1s";
            ul.style.transform = "translateY(-60px)";
        }
    },1500)
</script>

</html>